<?php
/**
 * 公共基础操作类
 * @author Midnight
 */
class PublicBaseAction extends Action {

	// 全局分页条数
	public $pageCount = 20;

	// 当前模版路径, 非模板文件
	public $tplPath;

	// 表头
	protected $bt;

	// 网站设置
	protected $setting;

	/**
	 * --------------------------------------------
	 * 初始化系统配置
	 * --------------------------------------------
	 * @author  Midnight,  yangyunzhou@foxmail.com
	 */
	public function __construct() {
		parent::__construct();

		/* 初始化当前模板根目录路径($tplPath), 根据配置自动支持分组模式 */
		if(C('APP_GROUP_LIST') == true) $group_name = '/' . GROUP_NAME;
		else $group_name = false;
		define('TPL_PATH',ROOT . TEMPLATE_PATH . $group_name . '/');
		define('TPL_PATH_DIR',R_E . '/' . TEMPLATE_PATH . $group_name);
		$this->assign('style',TPL_PATH);
		$this->assign('root',ROOT);
		C('TMPL_ACTION_ERROR',GROUP_NAME . ':public/jump');
		C('TMPL_ACTION_SUCCESS',GROUP_NAME . ':public/jump');
		/* 路径初始化结束 */

		/* 项目初始化 */
		$this->bt = C('DB_PREFIX');
		$this->xTitle = 'Midnight Studio';
		//$io = dataTemp('Setting');
		//$io['xAuthor'] = 'Midnight (yangyunzhou@foxmail.com)';
		//$io['xBeian'] = ($io['xBeian']) ? '<a href="http://www.miibeian.gov.cn" target="_blank">'.$io['xBeian'].'</a>' : false ;
		//foreach($io as $k=>$v) {$this->$k = $v;}
		//unset($io);
	}

	/**
	 * --------------------------------------------
	 * 设置来路
	 * --------------------------------------------
	 * @author Midnight, yangyunzhou@foxmail.com
	 */
	final protected function set_referer() {
		cookie('referer',$_SERVER['HTTP_REFERER']);
	}

	/**
	 * --------------------------------------------
	 * 获取定义的来路
	 * --------------------------------------------
	 * @author Midnight, yangyunzhou@foxmail.com
	 */
	final protected function get_referer() {
		$referer = cookie('referer');
		if(!$referer) $referer = $this->referer();
		return $referer;
	}

	/**
	 * --------------------------------------------
	 * 获取来路信息, 并返回
	 * --------------------------------------------
	 * @author  Midnight,  yangyunzhou@foxmail.com
	 */
	protected function referer() {
		if(!empty($_SERVER["REQUEST_URI"])) {
			$scriptName = $_SERVER["REQUEST_URI"];
			$nowurl = $scriptName;
		} else {
			$scriptName = $_SERVER["PHP_SELF"];
			if(empty($_SERVER["QUERY_STRING"])) $nowurl = $scriptName;
			else $nowurl = $scriptName . "?" . $_SERVER["QUERY_STRING"];
		}
		return $nowurl;
	}

	/**
	 * 成功提示
	 *
	 * @param String $message 提示消息
	 * @param String $url 跳转地址
	 * @param Bool $ajax true开启ajax支持
	 */
	protected function success($message,$url,$ajax) {
		$url = (isset($url)) ? $url : $this->get_referer();
		$this->assign('jumpUrl',$url);
		$this->_dispatch_jump($message,1,$ajax);
	}

	/**
	 * 错误提示
	 *
	 * @param String $message 提示消息
	 * @param String $url 跳转地址
	 * @param Bool $ajax true开启ajax支持
	 */
	protected function error($message,$url,$ajax) {
		$url = (isset($url)) ? $url : $this->get_referer();
		$this->assign('jumpUrl',$url);
		$this->_dispatch_jump($message,0,$ajax);
	}

	/**
	 * 获取当前用户唯一标识, 基于SessionId
	 */
	final protected function getUserSymbol() {
		return substr(Session::id(),0,8);
	}

	/**
	 * 生成令牌 (必须开启Session)
	 */
	final protected function saveToken() {
		$tokenType = C('TOKEN_TYPE');
		$token = $tokenType(Session::id());
		Session::set(C('TOKEN_NAME'),$token);
	}

	/**
	 * 验证令牌 (必须开启Session)
	 *
	 * @param $reset
	 */
	final protected function isValidToken($reset = false) {
		$tokenName = C('TOKEN_NAME');
		if($_REQUEST[$tokenName] == Session::get($tokenName)) {
			$valid = true;
			$this->saveToken();
		} else {
			$valid = false;
			//if($reset) $this->saveToken();
		}
		return $valid;
	}

	/**
	 * Base64 加密
	 *
	 * @param String $str 需要加密的字串
	 * @param Int $key 密钥
	 */
	final protected static function encrypt($str,$key = 9846278) {
		Import('Org.Crypt.Base64');
		return Base64::encrypt($str,$key);
	}

	/**
	 * Base64 解密
	 *
	 * @param String $str 需要解密的字串
	 * @param Int $key 密钥
	 */
	final protected static function decrypt($str,$key = 9846278) {
		Import('Org.Crypt.Base64');
		return Base64::decrypt($str,$key);
	}

	/**
	 * 验证码
	 */
	public function verify() {
		Import('ORG.Util.Image');
		return Image::buildImageVerify();
	}

	/**
	 * POST请求
	 */
	final protected function isFormPost() {
		return 'POST' == $_SERVER['REQUEST_METHOD'] ? true : false;
	}

	/**
	 * 后台管理员登陆状态加密与解密
	 * -> 用于获取登录用户ID、Name
	 * -> 限于储存Session
	 *
	 * @param $uid 用户ID
	 * @param $userName 用户名
	 * @return unknown_type
	 */
	final protected function admin_state($uid,$userName) {
		$cookie = 'admin';
		if($uid && $userName) { /* 加密 */
			$jminfo = $uid . '\t' . $userName;
			$vl = Cookie::set($cookie,$this->encrypt($jminfo));
		} else if(!$uid && !$userName) { /* 解密 */
			$jm = $this->decrypt(Cookie::get($cookie));
			$jm = explode('\t',$jm);
			if(empty($jm[0])) return false;
			$vl = array('uid'=>$jm[0],'name'=>$jm[1]);
		} else
			return false;
		return $vl;
	}

	/**
	 * 设置后台用户登录状态
	 *
	 * @param Int $id
	 * @return
	 */
	final protected function set_admin_state($id) {
		return Cookie::set('admin',$this->encrypt($id));
	}

	/**
	 * 获取后台用户登录状态
	 */
	final protected function get_admin_state() {
		return $this->decrypt(Cookie::get('admin'));
	}

	/**
	 * --------------------------------------------
	 * 删除后台用户登录状态
	 * --------------------------------------------
	 * @author  Midnight,  yangyunzhou@foxmail.com
	 */
	final protected function del_admin_state() {
		return Cookie::delete('admin');
	}

	/**
	 * 设置后台用户信息
	 *
	 * @param Int $id 用户标识
	 * @param Array $info 用户信息
	 */
	final protected function set_admin_info($id,$info) {
		unset($info['password']);
		return F("admin_$id",$info);
	}

	/**
	 * 获取后台用户信息
	 *
	 * @param Int $id 用户标识
	 */
	final protected function get_admin_info($id = FALSE) {
		// 获取当前登陆状态中的用户ID
		if(!$id) $id = $this->get_admin_id();
		$info = F("admin_$id");
		if($info['uid'] != $id) {
			return false;
		} else {
			return $info;
		}
	}

	/**
	 * 获取当前登陆用户ID
	 */
	final protected function get_admin_id() {
		return $this->decrypt(Cookie::get('admin'));
	}

	/**
	 * getSelect 高级方法
	 * 支持模板赋值
	 *
	 * @param Array $data 数据集
	 * @param unknown_type $option 数据集格式
	 * @param String $selected 要选中的信息
	 * @param String $name 用于模板赋值Name
	 * @param Bool $tag 用于输出 <Select></Select>
	 */
	final protected function getSelect($data,$option,$selected = FALSE,$name = FALSE,$tag = FALSE) {
		if($tag === TRUE) {
			$t = '<select name="' . $name . '">';
			$w = '</select>';
		} else {
			$t = $w = FALSE;
		}
		$vl = getSelect($data,$option,$selected);
		$vl = $t . $vl . $w;
		if($name) $this->assign($name,$vl);
		else halt('Action: ' . ACTION_NAME . ' getSelect 高级方法' . ' $name 不能为空');
		unset($data,$option,$selected,$name);
		return $vl;
	}

	/**
	 * getRadio 高级方法
	 * 支持模板赋值
	 *
	 * @param Array $data 数据集
	 * @param String $name 表单名
	 * @param String $selected 选中的值
	 *
	 * 使用方法:
	 * getRadio(array(1=>'开放', 0=>'关闭'), 'site_switch', $io['site_switch']);
	 */
	final protected function getRadio($data,$name,$selected = false) {
		$vl = getRadio($data,$name,$selected);
		$this->assign($name,$vl);
		return $vl;
	}

	/**
	 * getCheckbox 高级方法
	 * 支持模板赋值
	 *
	 * @param Array $data
	 * @param Array $format
	 * @param String $select
	 * @param String $name
	 */
	final protected function getCheckbox($data=array(), $format=array(), $name, $select){
		$val = getCheckbox($data, $format, $select);
		$this->assign($name, $val);
		return $val;
	}

	/**
	 * getCheckboxSingle 高级方法
	 * 支持模板赋值
	 *
	 * @param String $ShowInfo 标签要提示的内容
	 * @param String $name 标签name赋值
	 * @param Int $selected 0/1 整数 用于选中状态
	 */
	final protected function getCheckboxSingle($ShowInfo,$name,$selected) {
		$vl = getCheckboxSingle($ShowInfo,$name,$selected);
		$this->assign($name,$vl);
		return $vl;
	}
}
?>